package com.jay.nio.channel.clazz.DatagramChannel;

import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.charset.Charset;
import java.util.Date;

public class UDPClient {
	public static void main(String[] args) throws Exception {
		/********************************************
		 * 发送部分
		 ********************************************/
		// 使用DatagramChannel的open工厂方法创建一个数据报信道实例,该实例未绑定
		DatagramChannel channel = DatagramChannel.open();
		System.out.println("Ops supported are: " + channel.validOps());

		// 准备发送的文本
		String sendString = "你好,服务器. @" + new Date().toString();

		// 将要发送的文本进行编码后置入一个缓冲区中
		ByteBuffer sendBuffer = ByteBuffer.wrap(sendString.getBytes("UTF-16"));

		// 创建一个包含了给定缓冲区中的中的数据的数据报文,并将其发送到目的地址指定的SocketAddress上
		channel.send(sendBuffer, new InetSocketAddress("localhost", 5000));
		System.out.println("向服务器发送信息完毕");

		/********************************************
		 * 接收部分
		 ********************************************/
		// 使用ByteBuffer的静态方法创建一个新缓冲区,最长接收为80字节的数据报文
		ByteBuffer receiveBuffer = ByteBuffer.allocate(80);

		// 收取服务器端返回的信息
		SocketAddress remoteAddress = channel.receive(receiveBuffer);
		receiveBuffer.flip();

		// 将字节转化为为UTF-16的字符串
		String receivedString = Charset.forName("UTF-16").newDecoder()
				.decode(receiveBuffer).toString();

		// 控制台打印出来
		System.out.println("接收到来自服务器" + remoteAddress.toString() + "的信息:"
				+ receivedString);
	}

}
